package com.ilink.groundservice.controller.AiXNew;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ilink.groundservice.entity.VO.AiX.AiXSkillTreeResponse;
import com.ilink.groundservice.service.Skill.AiXSkillTreeService;
import com.ilink.ilinkapi.dto.ground.AiX.AiXSkillTreeFilterRequest;
import com.ilink.ilinkapi.dto.ground.AiX.AiXSkillTreeInsertRequest;
import com.ilink.ilinkapi.dto.ground.AiX.AiXSkillTreeUpdateRequest;
import com.ilink.ilinkapi.dto.ground.AiX.AiXSkillProgressUpdateRequest;
import com.ilink.ilinkcommon.domain.R;
import com.ilink.ilinkcommon.log.method.MethodLog;
import com.ilink.ilinkcommon.utils.UserContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@Slf4j
@RequestMapping("/ground/aix/skill-tree")
@RestController
@RequiredArgsConstructor
public class AiXSkillTreeController {

    private final AiXSkillTreeService skillTreeService;

    @MethodLog("获取技能树列表")
    @GetMapping("/list")
    public R getSkillTreeList(@RequestParam(required = false) Long areaId,
                              @RequestParam(required = false) String tag,
                              @RequestParam(required = false) String keyword,
                              @RequestParam(defaultValue = "1") Integer page,
                              @RequestParam(defaultValue = "10") Integer size) {
        try {
            AiXSkillTreeFilterRequest request = new AiXSkillTreeFilterRequest();
            request.setAreaId(areaId);
            request.setTag(tag);
            request.setKeyword(keyword);
            request.setPage(page);
            request.setSize(size);
            
            IPage<AiXSkillTreeResponse> responseIPage = skillTreeService.getSkillTreeList(request);
            log.info("获取技能树列表成功, total: {}", responseIPage.getTotal());
            return R.ok("技能树列表获取成功", responseIPage);
        } catch (Exception e) {
            log.error("获取技能树列表失败: {}", e.getMessage());
            return R.error("获取技能树列表失败: " + e.getMessage());
        }
    }

    @MethodLog("获取技能树详情")
    @GetMapping("/{skillTreeId}")
    public R getSkillTreeDetail(@PathVariable Long skillTreeId) {
        try {
            AiXSkillTreeResponse response = skillTreeService.getSkillTreeById(skillTreeId);
            log.info("获取技能树详情成功, skillTreeId: {}", skillTreeId);
            return R.ok("技能树详情获取成功", response);
        } catch (Exception e) {
            log.error("获取技能树详情失败: {}", e.getMessage());
            return R.error("获取技能树详情失败: " + e.getMessage());
        }
    }

    @MethodLog("获取技能树进度")
    @GetMapping("/{skillTreeId}/progress")
    public R getSkillTreeProgress(@PathVariable Long skillTreeId) {
        try {
            String userId = UserContext.getUserId();
            if (userId == null) {
                return R.error("用户未登录");
            }
            
            AiXSkillTreeResponse response = skillTreeService.getUserSkillTreeProgress(skillTreeId, userId);
            log.info("获取技能树进度成功, skillTreeId: {}, userId: {}", skillTreeId, userId);
            return R.ok("技能树进度获取成功", response);
        } catch (Exception e) {
            log.error("获取技能树进度失败: {}", e.getMessage());
            return R.error("获取技能树进度失败: " + e.getMessage());
        }
    }

    @MethodLog("更新技能树进度")
    @PostMapping("/{skillTreeId}/progress")
    public R updateSkillTreeProgress(@PathVariable Long skillTreeId,
                                     @RequestBody AiXSkillProgressUpdateRequest request) {
        try {
            String userId = UserContext.getUserId();
            if (userId == null) {
                return R.error("用户未登录");
            }
            
            request.setSkillTreeId(skillTreeId);
            skillTreeService.updateUserSkillProgress(request, userId);
            log.info("更新技能树进度成功, skillTreeId: {}, userId: {}", skillTreeId, userId);
            return R.ok("技能树进度更新成功");
        } catch (Exception e) {
            log.error("更新技能树进度失败: {}", e.getMessage());
            return R.error("更新技能树进度失败: " + e.getMessage());
        }
    }

    @MethodLog("重置技能树进度")
    @PostMapping("/{skillTreeId}/reset")
    public R resetSkillTreeProgress(@PathVariable Long skillTreeId) {
        try {
            String userId = UserContext.getUserId();
            if (userId == null) {
                return R.error("用户未登录");
            }
            
            skillTreeService.resetUserSkillProgress(skillTreeId, userId);
            log.info("重置技能树进度成功, skillTreeId: {}, userId: {}", skillTreeId, userId);
            return R.ok("技能树进度重置成功");
        } catch (Exception e) {
            log.error("重置技能树进度失败: {}", e.getMessage());
            return R.error("重置技能树进度失败: " + e.getMessage());
        }
    }

    @MethodLog("创建技能树")
    @PostMapping("/create")
    public R createSkillTree(AiXSkillTreeInsertRequest request) {
        try {
            Long skillTreeId = skillTreeService.insertSkillTree(request);
            log.info("创建技能树成功, skillTreeId: {}", skillTreeId);
            return R.ok("技能树创建成功", skillTreeId);
        } catch (Exception e) {
            log.error("创建技能树失败: {}", e.getMessage());
            return R.error("创建技能树失败: " + e.getMessage());
        }
    }

    @MethodLog("更新技能树")
    @PostMapping("/update")
    public R updateSkillTree(@RequestBody AiXSkillTreeUpdateRequest request) {
        try {
            skillTreeService.updateSkillTree(request);
            log.info("更新技能树成功, skillTreeId: {}", request.getSkillTreeId());
            return R.ok("技能树更新成功");
        } catch (Exception e) {
            log.error("更新技能树失败: {}", e.getMessage());
            return R.error("更新技能树失败: " + e.getMessage());
        }
    }

    @MethodLog("删除技能树")
    @PostMapping("/delete/{skillTreeId}")
    public R deleteSkillTree(@PathVariable Long skillTreeId) {
        try {
            skillTreeService.deleteSkillTree(skillTreeId);
            log.info("删除技能树成功, skillTreeId: {}", skillTreeId);
            return R.ok("技能树删除成功");
        } catch (Exception e) {
            log.error("删除技能树失败: {}", e.getMessage());
            return R.error("删除技能树失败: " + e.getMessage());
        }
    }

    @MethodLog("获取技能树最常用的8个标签")
    @GetMapping("/get_skill_tree_tags")
    public R getSkillTreeTags(@RequestParam Long areaId) {
        try {
            List<String> tags = skillTreeService.getSkillTreeTags(areaId);
            return R.ok("技能树最常用的8个标签", tags);
        } catch (Exception e) {
            log.error(e.getMessage());
            return R.error(e.getMessage());
        }
    }

    @MethodLog("获取技能树标签")
    @GetMapping("/categories/tags")
    public R getAllSkillTreeTags(@RequestParam Long areaId) {
        try {
            List<String> tags = skillTreeService.getAllSkillTreeTags(areaId);
            log.info("获取技能树标签成功, count: {}", tags.size());
            return R.ok("技能树标签获取成功", tags);
        } catch (Exception e) {
            log.error("获取技能树标签失败: {}", e.getMessage());
            return R.error("获取技能树标签失败: " + e.getMessage());
        }
    }

    @MethodLog("更新技能树封面")
    @PostMapping("/{skillTreeId}/cover")
    public R updateSkillTreeCover(@PathVariable Long skillTreeId,
                                  @RequestParam("file") MultipartFile file) {
        try {
            skillTreeService.updateSkillTreeCover(file, skillTreeId);
            log.info("更新技能树封面成功, skillTreeId: {}", skillTreeId);
            return R.ok("技能树封面更新成功");
        } catch (Exception e) {
            log.error("更新技能树封面失败: {}", e.getMessage());
            return R.error("更新技能树封面失败: " + e.getMessage());
        }
    }

    @MethodLog("获取热门技能树")
    @GetMapping("/popular")
    public R getPopularSkillTrees(@RequestParam(defaultValue = "10") Integer limit) {
        try {
            List<AiXSkillTreeResponse> skillTrees = skillTreeService.getPopularSkillTrees(limit);
            log.info("获取热门技能树成功, count: {}", skillTrees.size());
            return R.ok("热门技能树获取成功", skillTrees);
        } catch (Exception e) {
            log.error("获取热门技能树失败: {}", e.getMessage());
            return R.error("获取热门技能树失败: " + e.getMessage());
        }
    }

    @MethodLog("获取用户技能树")
    @GetMapping("/user")
    public R getUserSkillTrees(@RequestParam(required = false) Long areaId) {
        try {
            String userId = UserContext.getUserId();
            if (userId == null) {
                return R.error("用户未登录");
            }
            
            List<AiXSkillTreeResponse> skillTrees = skillTreeService.getUserSkillTrees(userId, areaId);
            log.info("获取用户技能树成功, userId: {}, count: {}", userId, skillTrees.size());
            return R.ok("用户技能树获取成功", skillTrees);
        } catch (Exception e) {
            log.error("获取用户技能树失败: {}", e.getMessage());
            return R.error("获取用户技能树失败: " + e.getMessage());
        }
    }
} 